package progress.exa30_3;

import java.lang.reflect.*;
import java.util.*;


public class CopyOfTest {

    public static void main(String[] args) {
        int[] a = { 1, 2, 3 };
        a = (int[]) goodCopyOf(a, 10);
        System.out.println(Arrays.toString(a));

        String[] b = { "Tom", "Dick", "Harry" };
        System.out.println("好的copyOf实现方式：");
        b = (String[]) goodCopyOf(b, 10);
        System.out.println(Arrays.toString(b));

        System.out.println("不好的copyOf实现方式访问数组：");
        Object[] bad = badCopyOf(b, 10);
        System.out.println(Arrays.toString(bad));
    }


    /**
     *  数组复制方法实现
     * （并不推荐这种做法,因为这样创建的是Object的数组，不能进行数组类型强转操作，也就是说每次取出元素使用都要进行强转）
     * @param a
     * @param newLength
     * @return
     */
    public static Object[] badCopyOf(Object[] a, int newLength){
        Object[] newArray = new Object[newLength];
        System.arraycopy(a, 0, newArray, 0, Math.min(a.length, newLength));
        return newArray;
    }


    /**
     * 数组复制方法实现
     * 这种方式的好处是可以对数组类型进行强转的
     * @param a
     * @param newLength
     * @return
     */
    public static Object goodCopyOf(Object a, int newLength) {
        Class<?> cl = a.getClass();
        if (!cl.isArray()) return null;
        //获得数组元素类型
        Class<?> componentType = cl.getComponentType();
        int length = Array.getLength(a);//获得数组长度
        Object newArray = Array.newInstance(componentType, newLength);
        System.arraycopy(a, 0, newArray, 0, Math.min(length, newLength));
        return newArray;
    }
}

